package com.txsj.scan;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.KeyEvent;
import android.view.View;
import android.widget.TextView;

import com.greendao.UnusefulEpcDao;
import com.txsj.scan.activity.AllocationActivity;
import com.txsj.scan.adapter.UnusefulAdapter;
import com.txsj.scan.adapter.UsefulAdapter;
import com.txsj.scan.base.BaseActivity;
import com.txsj.scan.bean.EpcGoodsInfo;
import com.txsj.scan.bean.EpcInfo;
import com.txsj.scan.bean.TagInfo;
import com.txsj.scan.bean.UnusefulEpc;
import com.txsj.scan.bean.UsefulGoodsEpc;
import com.txsj.scan.db.GreenDaoUtils;
import com.txsj.scan.presenter.MainPresenter;
import com.txsj.scan.reader.EpcUtils;
import com.txsj.scan.reader.setpage.Setting;
import com.txsj.scan.view.IMainView;

import java.util.ArrayList;
import java.util.List;

//                       .::::.
//                     .::::::::.
//                    :::::::::::
//                 ..:::::::::::'
//              '::::::::::::'
//                .::::::::::
//           '::::::::::::::..
//                ..::::::::::::.
//              ``::::::::::::::::
//               ::::``:::::::::'        .:::.
//              ::::'   ':::::'       .::::::::.
//            .::::'      ::::     .:::::::'::::.
//           .:::'       :::::  .:::::::::' ':::::.
//          .::'        :::::.:::::::::'      ':::::.
//         .::'         ::::::::::::::'         ``::::.
//     ...:::           ::::::::::::'              ``::.
//    ```` ':.          ':::::::::'                  ::::..
//                       '.:::::'                    ':'````..
//
//                            _ooOoo_
//                           o8888888o
//                           88" . "88
//                           (| -_- |)
//                           O\  =  /O
//                        ____/`---'\____
//                      .'  \\|     |//  `.
//                     /  \\|||  :  |||//  \
//                    /  _||||| -:- |||||-  \
//                    |   | \\\  -  /// |   |
//                    | \_|  ''\---/''  |   |
//                    \  .-\__  `-`  ___/-. /
//                  ___`. .'  /--.--\  `. . __
//               ."" '<  `.___\_<|>_/___.'  >'"".
//              | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//              \  \ `-.   \_ __\ /__ _/   .-` /  /
//         ======`-.____`-.___\_____/___.-`____.-'======
//                            `=---='
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

/**
 *　　　　　　　     ┏┓       ┏┓+ +
 *　　　　　　　  ┏┛┻━━━━━━━┛┻┓ + +
 *　　　　　　　     ┃　　　　　　 ┃
 *　　　　　　　    ┃　　　━　　　┃ ++ + + +
 *　　　　　　 █████━█████  ┃+
 *　　　　　　　  ┃　　　　　　 ┃ +
 *　　　　　　　 ┃　　　┻　　　┃
 *　　　　　　　┃　　　　　　 ┃ + +
 *　　　　　　　┗━━┓　　　 ┏━┛
 *               ┃　　  ┃
 *　　　　　　　　　┃　　  ┃ + + + +
 *　　　　　　　　　┃　　　┃　Code is far away from     bug with the animal protecting
 *　　　　　　　　　┃　　　┃ + 　　　　         神兽保佑,代码无bug
 *　　　　　　　　　┃　　　┃
 *　　　　　　　　　┃　　　┃　　+
 *　　　　　　　　　┃　 　 ┗━━━┓ + +
 *　　　　　　　　　┃ 　　　　　┣┓
 *　　　　　　　　　┃ 　　　　　┏┛
 *　　　　　　　　　┗┓┓┏━━━┳┓┏┛ + + + +
 *　　　　　　　　　 ┃┫┫　 ┃┫┫
 *　　　　　　　　　 ┗┻┛　 ┗┻┛+ + + +
 */
//                  佛祖保佑             永无BUG
//          佛曰:
//                  写字楼里写字间，写字间里程序员；
//                  程序人员写程序，又拿程序换酒钱。
//                  酒醒只在网上坐，酒醉还来网下眠；
//                  酒醉酒醒日复日，网上网下年复年。
//                  但愿老死电脑间，不愿鞠躬老板前；
//                  奔驰宝马贵者趣，公交自行程序员。
//                  别人笑我忒疯癫，我笑自己命太贱；
//                  不见满街漂亮妹，哪个归得程序员？

public class MainActivity extends BaseActivity<MainPresenter> implements IMainView {

    private static final int USEFUL = 0x144;
    private static final int UNUSEFUL = 0x145;
    public static int mSaveType = 0;
    public static boolean mIsMonitorOpen = false;

    private RecyclerView left_recyclerview, right_recyclerview;
    private List<EpcGoodsInfo> leftAdapterList;
    private UsefulAdapter usefulAdapter;
    private UnusefulAdapter unsefulAdapter;
    private List<TagInfo> rightAdapterList;
    private TextView mStartStop;

    private boolean isRunning = false;//如果线程在运行状态，不在重启

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case USEFUL:
                    EpcInfo epcInfo = (EpcInfo) msg.obj;
                    selectGoods(epcInfo);
                    break;
                case UNUSEFUL:
                    TagInfo tagInfo = (TagInfo) msg.obj;
                    unsefulAdapter.setData(tagInfo);
                    break;
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        EpcUtils.getInstance(this).connectPort();

        new Thread(new Runnable() {
            @Override
            public void run() {
//                presenter.getEpcRetrofitHttp();
//                presenter.getGoodsHttp();
            }
        }).start();

    }

    private void initView() {
        mStartStop = (TextView) findViewById(R.id.startstop);
        left_recyclerview = (RecyclerView) findViewById(R.id.left_recyclerview);
        right_recyclerview = (RecyclerView) findViewById(R.id.right_recyclerview);

        leftAdapterList = new ArrayList<>();
        rightAdapterList = new ArrayList<>();

        RecyclerView.LayoutManager manager = new LinearLayoutManager(MainActivity.this);
        left_recyclerview.setLayoutManager(manager);
        usefulAdapter = new UsefulAdapter(this);
        left_recyclerview.setAdapter(usefulAdapter);

        RecyclerView.LayoutManager manager2 = new LinearLayoutManager(MainActivity.this);
        right_recyclerview.setLayoutManager(manager2);
        unsefulAdapter = new UnusefulAdapter(this);
        right_recyclerview.setAdapter(unsefulAdapter);

        mStartStop.setText("开始盘存");
    }

    /**
     * 盘存
     *
     * @param view
     */
    public void startInventory(View view) {
        startStop();
    }

    private void startStop() {
        if (EpcUtils.getInstance(MainActivity.this).isStarted()){
            mStartStop.setText("开始盘存");
        }else {
            mStartStop.setText("结束盘存");
        }
        EpcUtils.getInstance(this).startStop();
    }

    /**
     * 清除数据
     *
     * @param view
     */
    public void clear(View view) {
        unsefulAdapter.clear();
        usefulAdapter.clear();
        GreenDaoUtils.getSingleTon().getmDaoSession().getTagInfoDao().deleteAll();
        GreenDaoUtils.getSingleTon().getmDaoSession().getUnusefulEpcDao().deleteAll();
    }

    /**
     * 设置
     *
     * @param view
     */
    public void onSet(View view) {
       startActivity(new Intent(MainActivity.this, Setting.class));
    }

    /**
     * 出入库
     *
     * @param view
     */
    public void outInInventory(View view) {
        Intent intent = new Intent(MainActivity.this, AllocationActivity.class);
        ArrayList<UsefulGoodsEpc> usefulGoodsEpcList = new ArrayList<>();
        for (EpcGoodsInfo goodsInfo : usefulAdapter.getData()) {
            UsefulGoodsEpc usefulEpc = new UsefulGoodsEpc();
            usefulEpc.setGoods_id(goodsInfo.getGoods_id());
            usefulEpc.setGoods_name(goodsInfo.getGoods_name());
            usefulEpc.setGoods_price(goodsInfo.getGoods_price());
            usefulEpc.setOrigin_price(goodsInfo.getOrigin_price());
            usefulEpc.setCount(goodsInfo.getCount());
            usefulGoodsEpcList.add(usefulEpc);
        }
        intent.putExtra("data", usefulGoodsEpcList);
        startActivity(intent);
    }

    /**
     * 开始对比
     *
     * @param view
     */
    public void startScan(View view) {
        unsefulAdapter.clear();
        usefulAdapter.clear();
        if (!isRunning) {
            isRunning = true;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    selectEpcList();
                }
            }).start();
        }
    }

    /**
     * 筛选标签，返回的是对应标签库里的数据，唯一的（否则标签造重了）
     *
     * @return 对比后的标签，要么有一个，要么没有
     */
    public void selectEpcList() {
        List<TagInfo> tagInfoList = GreenDaoUtils.getSingleTon().getmDaoSession().loadAll(TagInfo.class);
        for (TagInfo tagInfo : tagInfoList) {
            String strEpc = tagInfo.getStrEPC().replaceAll(" ", "");
            //解析
            String epcCode = strEpc.substring(9, strEpc.length());
            //场景调节数
            long sceneNumber = Integer.parseInt(epcCode.substring(0, 4), 16);
            //分类ID
            long classId = Integer.parseInt(epcCode.substring(4, 6), 16);
            //流水号
            long serialNumber = Integer.parseInt(epcCode.substring(6, epcCode.length()), 16);
            //分组标签数量
            long groupTagNumber = (long) Math.pow(2, classId);
            //分组id
            long groupId = (serialNumber / groupTagNumber) + 1;

//            //对比筛选
//            List<EpcInfo> epcList = GreenDaoUtils.getSingleTon().getmDaoSession().getEpcInfoDao().queryBuilder()
//                    .where(EpcInfoDao.Properties.Tag_group_id.eq(groupId), EpcInfoDao.Properties.Tag_class_id.eq(classId), EpcInfoDao.Properties.Scene_number.eq(sceneNumber))
//                    .list();
//            if (epcList != null && epcList.size() > 0 && epcList.get(0).getGoods_id() != 0) {
//                Message msg = new Message();
//                msg.what = USEFUL;
//                msg.obj = epcList.get(0);
//                handler.sendMessage(msg);
//            } else {
//                Message msg = new Message();
//                msg.what = UNUSEFUL;
//                msg.obj = tagInfo;
//                handler.sendMessage(msg);
//                saveDataToSql();//可以不存到数据库
//            }
        }
        isRunning = false;
    }

    /**
     * 对比找出标签数据后查询对应的商品
     *
     * @param epcInfo
     */
    public void selectGoods(EpcInfo epcInfo) {
//        List<EpcGoodsInfo> goodsInfoList = GreenDaoUtils.getSingleTon().getmDaoSession().getEpcGoodsInfoDao().queryBuilder()
//                .where(EpcGoodsInfoDao.Properties.Goods_id.eq(epcInfo.getGoods_id()))
//                .list();
//        if (null != goodsInfoList && goodsInfoList.size() > 0) {
//            leftAdapterList.add(goodsInfoList.get(0));
//            usefulAdapter.setData(goodsInfoList.get(0));
//        }
    }

    /**
     * 将读到的数据放入数据库
     */
    public void saveDataToSql() {
        UnusefulEpcDao unusefulEpcDao = GreenDaoUtils.getSingleTon().getmDaoSession().getUnusefulEpcDao();
        UnusefulEpc info = new UnusefulEpc();
        unusefulEpcDao.insertOrReplaceInTx(info);
    }

    @Override
    protected void onResume() {
        super.onResume();
        EpcUtils.getInstance(this).onResume();
    }

    @Override
    protected MainPresenter providePresenter() {
        return presenter = new MainPresenter(this);
    }

    @Override
    public Context context() {
        return this;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            askForOut();
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MENU) {
            return true;
        } else if (event.getKeyCode() == KeyEvent.KEYCODE_F4) {//扫码枪的按钮action：KEYCODE_F4
            //开始盘存
            startStop();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }


    @Override
    public void onEpcSuccess(List<EpcInfo> epcInfos) {

    }

    @Override
    public void onEpcError(Throwable e) {

    }

    @Override
    public void onGoodsSuccess() {

    }

    @Override
    public void onGoodsError() {

    }

}
